
package SemanticoPacote;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Igo
 */
public class cmd {
    
    /*<cmd> ::= ( <chamadaDeFuncao> | <expAtribuicao> | 
                <entradaDeDados> | <saidaNaTela> | <cmdCondicional> | <cmdRepeticao> ) 
     */

    public void sintaxeCmd (TabelaSimbolos tabelasimbolos, String escopo){

    /*public boolean sintaxeCmd (TabelaSimbolos tabelasimbolos){
*/
        chamadaDeFuncao funcao = new chamadaDeFuncao(tabelasimbolos);
        ExpAtribuicao atribuicao = new ExpAtribuicao();
        entradaDeDados entradaDados = new entradaDeDados();
        saidaNaTela saidaTela = new saidaNaTela();
        cmdCondicional condicional = new cmdCondicional();
        cmdRepeticao repeticao = new cmdRepeticao();
        declaraVariaveis variaveis = new declaraVariaveis();
        acessoStruct struct = new acessoStruct();

        
        // Verifica se é um identificador e chama chamada de função
        if(tabelasimbolos.getTipo().equals("identificador")) {

            if(tabelasimbolos.superLookahead(1).equals("[")) {
                int i = 1;
                while(tabelasimbolos.superLookahead(i).equals("["))
                    i += 3;

                if((tabelasimbolos.superLookahead(i).equals("->") || tabelasimbolos.superLookahead(i).equals(".")) &&
                        tabelasimbolos.superTipo(i+1).equals("identificador") &&
                        (tabelasimbolos.superLookahead(i+2).equals("=") ||
                        tabelasimbolos.superLookahead(i+2).equals("++") ||
                        tabelasimbolos.superLookahead(i+2).equals("--")))
                    atribuicao.expatribuicao(tabelasimbolos, escopo);

                else if(tabelasimbolos.superLookahead(i).equals("=") ||
                        tabelasimbolos.superLookahead(i).equals("++") ||
                        tabelasimbolos.superLookahead(i).equals("--"))
                    atribuicao.expatribuicao(tabelasimbolos, escopo);
            }

            else if((tabelasimbolos.superLookahead(1).equals("->") || tabelasimbolos.superLookahead(1).equals(".")) &&
                    tabelasimbolos.superTipo(2).equals("identificador") &&
                    (tabelasimbolos.superLookahead(3).equals("=") ||
                    tabelasimbolos.superLookahead(3).equals("++") ||
                    tabelasimbolos.superLookahead(3).equals("--")))
                atribuicao.expatribuicao(tabelasimbolos, escopo);

            else if(tabelasimbolos.superLookahead(1).equals("++") || tabelasimbolos.superLookahead(1).equals("--") ||
                    tabelasimbolos.superLookahead(1).equals("=") ) {
                atribuicao.expatribuicao(tabelasimbolos, escopo);
            }

            else if(tabelasimbolos.superTipo(1).equals("identificador")) {
                variaveis.declaraVariaveis(tabelasimbolos, escopo);
            }

            else
                funcao.chamaFuncao(escopo); 
        }

        else if(tabelasimbolos.getLookahead().equals("*")){
            atribuicao.expatribuicao(tabelasimbolos, escopo);
        }
        
        else if(tabelasimbolos.getLookahead().equals("scanf")){
            entradaDados.entradadados(tabelasimbolos);
        }

        else if(tabelasimbolos.getLookahead().equals("printf")){
            saidaTela.saidaTela(tabelasimbolos);
        }

        else if(tabelasimbolos.getLookahead().equals("if")){
            condicional.comandoCondicional(tabelasimbolos);
        }

        else if(tabelasimbolos.getLookahead().equals("while") | tabelasimbolos.getLookahead().equals("do") | tabelasimbolos.getLookahead().equals("for") ){
            repeticao.comandoRepeticao(tabelasimbolos, escopo);
        }

        else if(tabelasimbolos.getTipo().equals("palavra")) {
            variaveis.declaraVariaveis(tabelasimbolos, escopo);
        }

    }
}
